// Axios 封装
import axios from "axios";
import type { AxiosInstance, AxiosResponse } from "axios";
import { message } from "ant-design-vue";
import type { ApiResponse } from "@/types/api";
import { useUserStore } from "@/stores/user";

// 创建 axios 实例
const service: AxiosInstance = axios.create({
  baseURL:
    import.meta.env.MODE === "production" ? "http://api.imxyzz2kk.fun" : "/api",
  timeout: 15000,
  headers: {
    "Content-Type": "application/json;charset=UTF-8",
  },
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    const userStore = useUserStore();

    // 添加 token
    if (userStore.token) {
      config.headers["Authorization"] = `Bearer ${userStore.token}`;
    }

    // 添加租户信息（如果存在）
    if (userStore.userInfo?.tenantId && userStore.userInfo.tenantId > 0) {
      config.headers["X-Tenant-Id"] = userStore.userInfo.tenantId;
    }

    return config;
  },
  (error) => {
    console.error("Request error:", error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse<ApiResponse>): any => {
    const res = response.data;

    // 如果返回的状态码不是 200，说明接口请求有问题
    if (res.code !== 200) {
      // 401: 未登录或 token 过期（需要自动跳转）
      if (res.code === 401) {
        message.error("未登录或登录已过期");
        const userStore = useUserStore();
        userStore.logout();
        window.location.href = "/login";
        return Promise.reject(new Error(res.message || "Unauthorized"));
      }

      // 403: 无权限（需要提示）
      if (res.code === 403) {
        message.error("没有权限访问");
        return Promise.reject(new Error(res.message || "Forbidden"));
      }

      // 其他业务错误：不在这里显示，由页面处理
      return Promise.reject(new Error(res.message || "Error"));
    }

    return res;
  },
  (error) => {
    console.error("Response error:", error);

    // 网络错误或服务器错误，统一在拦截器中处理
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // Token 过期或未登录
          message.error("登录已过期，请重新登录");
          const userStore = useUserStore();
          userStore.logout();
          // 使用 router 跳转而不是 window.location
          setTimeout(() => {
            window.location.href = "/login";
          }, 500);
          break;
        case 403:
          // 403 可能是权限不足或 Token 失效
          // 检查是否有 Token
          const store = useUserStore();
          if (store.token) {
            // 有 Token 但 403，可能是 Token 失效
            message.error("登录已失效，请重新登录");
            store.logout();
            setTimeout(() => {
              window.location.href = "/login";
            }, 500);
          } else {
            message.error("没有权限访问");
          }
          break;
        case 404:
          message.error("请求的资源不存在");
          break;
        case 500:
          message.error("服务器内部错误");
          break;
        default:
          // 其他错误不在拦截器中显示
          break;
      }
    } else if (error.code === "ECONNABORTED") {
      message.error("请求超时，请稍后重试");
    } else if (!error.response) {
      message.error("网络连接失败，请检查网络");
    }

    return Promise.reject(error);
  }
);

export default service;
